package cn.tedu.v4;

/**
 * 多线程并发安全问题
 * 当多个线程并发操作同一个资源时侯，由于写出切换时机不确定
 * 可能会导致代码执行混乱，而且还有可能出现程序错误、严重软件瘫痪【卡死】
 *
 * 客户端  多线程并发 X    服务器  多线程并发  √
 *
 *  synchronized 关键字 ---多线程并发  同步频
 *
 *  使用方式：①同步块方式   最常用 ，同步：控制线程执行顺序，避免线程之间冲突
 *          ②同步方法 一个线程执行完毕之后，在执行下一个
 *  定义语法：
 *        synchronized （同步监视器对象）{
 *            需要同步运行的代码块；
 *        }
 *        案例：去厕所  问题
 */
public class Thread_syn {
    public static void main(String[] args) {
        //创建厕所类--
        WC wc=new WC();
        //创建第一个人--线程
        Thread p1=new Thread(()->{
            wc.door();//去厕所功能
        });
        Thread p2=new Thread(()->{
            wc.door();//去厕所功能
        });
        p1.start();
        p2.start();
    }
}
//创建厕所类
class WC{
    public void door(){//去厕所
        //线程实例--记录线程信息
        Thread s=Thread.currentThread();
        System.out.println(s.getName()+"去厕所");
        try {
            //同步锁 :门夹一把锁
            //多线程执行 同步频，每次只放行一个线程
            synchronized (this) {
                Thread.sleep(5000);
                System.out.println("找门进去");
            }
                Thread.sleep(3000);
                System.out.println(s.getName() + "穿裤子走人");
            } catch(InterruptedException e){
                e.printStackTrace();
            }
    }
}